package com.edu.test;

import com.edu.bean.User;
import org.junit.Test;

import java.lang.reflect.Field;

public class MyTest03 {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

        Class clazz = User.class;// 获取到了 User.class文件的 类类型对象
        //Field 对象 是用来描述一条属性的对象，包含这个属性的 名字 访问修饰符 属性的数据类型

        Field[] fields = clazz.getFields();// 获取 User.class文件中 包含的 所有的公有属性
        for (Field field : fields) {
            System.out.println(field.getName());
            System.out.println(field.getType());
        }


        Field[] allFields = clazz.getDeclaredFields();//获取 所有的属性
        for (Field field : allFields) {
            System.out.println(field.getName()+"---"+field.getType()+"----");
        }

        try {
            Field f = clazz.getField("age");//通过某个属性名 获取 该公有属性的信息
            System.out.println(f.getName()+"---"+f.getType());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
            System.out.println("没有该属性");
        }


        try {
            Field f2 = clazz.getDeclaredField("username");// 通过指定 属性名 获取该属性的信息
            System.out.println(f2.getName()+"------"+f2.getType());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }


    @Test
    public void test01(){
        Class clazz = User.class;
        User user = new User();
        //正常 设置一个对象的属性值  对象.属性=xxxx  对象.set属性(值)
        user.age = 25;
        user.sex = "男";
        user.setUsername("zhangsan");
        System.out.println(user);

        //正常获取属性的值 对象.属性 对象.get属性();
        System.out.println(user.age);
//        System.out.println(user.getUsername());

        User user2 = new User();
        user2.age= 30;
        try {
            // 通过 反射机制 获取一个对象的公有属性
            Field field = clazz.getField("age");//获取到 User.class 文件中 的 一个age属性对象
            System.out.println("该属性的属性名:"+field.getName());
            System.out.println("该属性的数据类型"+field.getType());
            System.out.println("该属性的属性值:");
            System.out.println(field.get(user2));

            // 通过反射机制 获取一个对象的 私有属性值
            Field filed2 = clazz.getDeclaredField("username");
            filed2.setAccessible(true);// 设置 该属性的 可见性为 可见 true时表示该属性 开启暴力反射
            System.out.println(filed2.get(user));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
            System.out.println("没有该属性");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void test02(){
        User user = new User();
        //通过反射 设置一个对象的属性
        Class clazz = User.class;
        try {
            Field filed = clazz.getDeclaredField("password");
            filed.setAccessible(true);
            filed.set(user,"123456");
            System.out.println(user);
            System.out.println(filed.get(user));
        } catch (NoSuchFieldException e) {
            System.out.println("该属性不存在");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            System.out.println("该属性无法直接访问");
            e.printStackTrace();
        }
    }

}
